import Vue from 'vue';
import axios from 'axios';
import serviceUrl from './https.js';
import store from '../store/index.js';
// 取消请求
let CancelToken = axios.CancelToken;

// 请求超时的时间限制
axios.defaults.timeout = 20000;
let domain = 'https://jxbscbd.ijovo.com/';
// let domain = 'https://api.jxbscbd.com/' // 正式环境

axios.defaults.baseURL = domain;
/**
 * lihongyu  2019/4/17 10:47
 * @Description: 注释掉写死的token，前端请求可以在地址后面添加 ?token = xxxx
 **/
let token = null;
// 开始设置请求 发起的拦截处理
// config 代表发起请求的参数的实体
axios.interceptors.request.use(
  (config) => {
    if (axios.token) {
      // 这里将token设置到headers中，header的key是Authorization，这个key值根据你的需要进行修改即可
      config.headers.Authorization = axios.token;
    }
    // 得到参数中的 requestName 字段，用于决定下次发起请求，取消对应的 相同字段的请求
    // 如果没有 requestName 就默认添加一个 不同的时间戳
    let requestName;
    if (config.method === 'post') {
      if (config.data && config.data.requestName) {
        requestName = config.data.requestName;
      } else {
        requestName = new Date().getTime() + config.url;
      }
      config.data = {
        ...config.data,
        requestName: requestName,
      };
    } else {
      if (config.params && config.params.requestName) {
        requestName = config.params.requestName;
      } else {
        requestName = new Date().getTime() + config.url;
      }
      config.params = {
        ...config.params,
        requestName: requestName,
      };
    }
    // 判断，如果这里拿到的参数中的 requestName 在上一次请求中已经存在，就取消上一次的请求
    if (requestName) {
      if (axios[requestName] && axios[requestName].cancel) {
        axios[requestName].cancel();
      }
      config.cancelToken = new CancelToken((c) => {
        axios[requestName] = {};
        axios[requestName].cancel = c;
      });
    }
    return config;
  },
  (error) => {
    return Promise.reject(error);
  }
);

// 请求到结果的拦截处理
axios.interceptors.response.use(
  (config) => {
    try {
      if (config.data.code) {
        if (config.data.code !== '200') {
          console.log('服务器繁忙,请重试');
        }
      } else {
        console.log('服务器繁忙,请重试');
      }
    } catch (e) {}
    // 返回请求正确的结果
    return config;
  },
  (error) => {
    // 错误的请求结果处理，这里的代码根据后台的状态码来决定错误的输出信息
    try {
      if (error.response.data.code) {
        if (error.response.data.code !== '200') {
          console.log('服务器繁忙,请重试');
        }
      } else {
        console.log('服务器繁忙,请重试');
      }
    } catch (e) {}
    return Promise.reject(error);
  }
);


// 使用配置里面的方法，$send
Vue.prototype.$send = function (url, params) {
  let urlAry = url.split('.');
  let config = JSON.parse(JSON.stringify(serviceUrl[urlAry[0]][urlAry[1]]));
  let parameter = Object.assign(config.params || {}, params || {});
  parameter = config.type === 'get' ? { params: parameter } : parameter;
  return new Promise((resolve, reject) => {
    axios[config.type](config.url, parameter)
      .then((res) => {
        resolve(res); // 返回请求成功的数据 data
      })
      .catch((err) => {
        console.log('err', err);
        reject(err);
      });
  });
};
// 设置token
Vue.prototype.$setToken = function (data, fun) {
  axios.token = data || token;
  store.commit('setToken', axios.token);
  fun && fun(axios.token);
};
// 动态设置接口地址
Vue.prototype.$setApi = (data) => {
  if (data) {
    axios.defaults.baseURL = data;
  }
};
// 请求示例
// requestName 为多余的参数 作为请求的标识，下次发起相同的请求，就会自动取消上一次还没有结束的请求
// 比如正常的请求参数只有一个 name: '123'，但是这里我们需要额外再加上一个 requestName
/**
 this.$send(url, { name: '123', requestName: 'post_1' })
 .then(res => {
   console.log(`请求成功：${res}`)
 })
 */
export default axios;
